package co.edu.unal.geditor.controller.action.undoable;

import javax.swing.undo.AbstractUndoableEdit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;

import co.edu.unal.geditor.controller.App;
import co.edu.unal.geditor.model.BoundBox;
import co.edu.unal.geditor.model.GraphElement;

public class UndoableMove extends AbstractUndoableEdit {

	public UndoableMove(GraphElement GE) {
		m_bbOld = new BoundBox(GE.getBoundBox().getLeftUp(), GE.getBoundBox()
				.getRightDown());
		oldPos = App.getInstance().getDrawing().getElementOrder(GE);
		m_geMoved = GE;
	}

	public void undo() throws CannotUndoException {
		newPos = App.getInstance().getDrawing().getElementOrder(m_geMoved);

		m_bbNew = new BoundBox(m_geMoved.getBoundBox().getLeftUp(), m_geMoved
				.getBoundBox().getRightDown());
		m_geMoved.getBoundBox().setLeftUp(m_bbOld.getLeftUp());
		m_geMoved.getBoundBox().setRightDown(m_bbOld.getRightDown());

		App.getInstance().getDrawing().removeElementAt(newPos);// Quita el
																// elemento de
																// su posición
																// actual para
																// pasarlo a su
																// vieja
																// posición y
																// este atrás de
																// aquellos
																// objetos que
																// alguna vez
																// estuvieron
																// encima de él
		App.getInstance().getDrawing().insertElementAt(m_geMoved, oldPos);
		canRedo = true;

	}

	public void redo() throws CannotRedoException {
		m_geMoved.getBoundBox().setLeftUp(m_bbNew.getLeftUp());
		m_geMoved.getBoundBox().setRightDown(m_bbNew.getRightDown());
		App.getInstance().getDrawing().removeElementAt(oldPos);// Quita el
																// elemento de
																// su posición
																// actual para
																// pasarlo a su
																// nueva
																// posición, es
																// decir, a
																// aquella en la
																// que estuvo
																// antes de que
																// se hiciera el
																// undo
		App.getInstance().getDrawing().insertElementAt(m_geMoved, newPos);
	}

	public boolean canUndo() {
		return (m_bbOld != null);
	}

	public boolean canRedo() {
		return (canRedo);
	}

	public String getPresentationName() {
		return "Move Element";
	}

	private static final long serialVersionUID = 1L;
	private BoundBox m_bbOld;
	private BoundBox m_bbNew;
	private GraphElement m_geMoved;
	private boolean canRedo = false;
	private int newPos;
	private int oldPos;
}
